home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / Hardware / pcmser / source / pcmser.device.s < prev    next >
Text File  |  1999-11-25  |  30KB  |  1,305 lines

  1.  
  2.         include "exec/types.i"
  3.  
  4.         include    exec/exec.i
  5.         include    devices/serial.i
  6.         include    resources/card.i
  7.  
  8.         include    macros.i
  9.         include    uart.i
  10.         include    cistpl.i
  11.         include    pcmser.i
  12.  
  13.  
  14.         xlib    OpenLibrary
  15.         xlib    CloseLibrary
  16.         xlib    FindTask
  17.         xlib    FreeMem
  18.         xlib    ReplyMsg
  19.         xlib    AddTail
  20.         xlib    Disable
  21.         xlib    Remove
  22.         xlib    OpenResource
  23.         xlib    Enable
  24.         xlib    RemHead
  25.  
  26.         xlib    Delay
  27.  
  28.         xlib    OwnCard
  29.         xlib    GetCardMap
  30.         xlib    CopyTuple
  31.         xlib    ReleaseCard
  32.         xlib    CardMiscControl
  33.  
  34.  
  35. ;--Constants
  36. REVISION=7
  37. VERSION=0
  38. MYPRI=0
  39. UNITS=1
  40.         section    main,code
  41. ;------------------------------------------------------------------------
  42.  
  43. j        moveq    #-1,d0    ;Stupid user tried to start us!
  44.         rts
  45.  
  46. initddescript    dc.w    RTC_MATCHWORD    ;RT_MATCHWORD
  47.         dc.l    initddescript    ;RT_MATCHTAG
  48.         dc.l    endofcode    ;RT_ENDSKIP
  49.         dc.b    RTF_AUTOINIT    ;RT_FLAGS
  50.         dc.b    VERSION        ;RT_VERSION
  51.         dc.b    NT_DEVICE    ;RT_TYPE
  52.         dc.b    MYPRI        ;RT_PRI
  53.         dc.l    myname
  54.         dc.l    idstring
  55.         dc.l    init
  56.  
  57. myname        dc.b    "pcmser.device",0
  58. idstring    dc.b    "pcmser.device 0.7 (26.11.99)",13,10,0
  59.         cnop    0,4
  60.  
  61. init        dc.l    MYDEV_SIZEOF
  62.         dc.l    functable
  63.         dc.l    datatable
  64.         dc.l    initroutine
  65.  
  66.  
  67. ;--Function table
  68. functable    dc.l    opendevice    ;open        -6
  69.         dc.l    closedevice    ;close        -12
  70.         dc.l    expunge        ;expunge    -18
  71.         dc.l    resvec        ;reserved    -24
  72.         dc.l    beginio        ;BeginIO     -30
  73.         dc.l    abortio        ;AbortIO    -36
  74.         dc.l    -1        ;marks end of list
  75.  
  76. ;---Data table
  77. datatable    dc.l    0
  78.         dc.l    0
  79.         dc.b    NT_DEVICE
  80.         dc.b    0
  81.         dc.l    myname
  82.  
  83.         dc.b    LIBF_SUMUSED!LIBF_CHANGED ;UBYTE   LIB_FLAGS
  84.         dc.b    0        ;UBYTE   LIB_pad
  85.         dc.w    0        ;UWORD   LIB_NEGSIZE
  86.         dc.w    0        ;UWORD   LIB_POSSIZE
  87.         dc.w    VERSION        ;UWORD   LIB_VERSION
  88.         dc.w    REVISION    ;UWORD   LIB_REVISION
  89.         dc.l    idstring    ;APTR    LIB_IDSTRING
  90.         dc.l    0        ;ULONG   LIB_SUM
  91.         dc.w    0        ;UWORD   LIB_OPENCNT
  92.  
  93. _SysBase    dc.l    0
  94. devicebase    dc.l    0
  95.  
  96. ;========================================================================
  97. ;---initroutine---
  98. ;d0=devicebase
  99. ;a0=seglist
  100. ;
  101. ;return d0
  102. ;devicebase=ok
  103. ;0=error
  104. ;========================================================================
  105. initroutine    movem.l    d1-a6,-(sp)
  106.         move.l    d0,a5
  107.         move.w    #VERSION,LIB_VERSION(a5)
  108.         move.w    #REVISION,LIB_REVISION(a5)
  109.         move.l    d0,devicebase
  110.         move.l    a0,MD_SEGLIST(a5)
  111.         move.l    4.w,_SysBase
  112.         bsr.w    setupdevice
  113.         tst.l    d0
  114.         beq.b    .ok
  115.         moveq    #0,d0
  116.         bra.b    .end
  117.  
  118. .ok        move.l    a5,d0
  119. .end        movem.l    (sp)+,d1-a6
  120.         rts
  121.  
  122. ;========================================================================
  123. ;---opendevice---   guaranteed to be single threaded
  124. ;d0=unit
  125. ;d1=flags
  126. ;a1=io-request
  127. ;a6=devicebase
  128. ;
  129. ;return IO_ERROR
  130. ;0=ok
  131. ;!0=errorcode
  132. ;========================================================================
  133. opendevice    move.l    a6,-(sp)
  134.         cmp.l    #UNITS,d0
  135.         bge.w    .error
  136.         clr.b    IO_ERROR(a1)
  137.  
  138.         mulu    #PCMNODE_SIZEOF,d0
  139.         add.l    #serdata,d0
  140.         move.l    d0,IO_UNIT(a1)
  141.         move.l    d0,a0        ;a0=serunit
  142.  
  143.         tst.w    PCM_UNITOPENCNT(a0)    ;fix the shared access stuff
  144.         bne.b    .not1st
  145.         movem.l    a0-a1,-(sp)        ;this is the 1st time the
  146.         sub.l    a1,a1            ;device opened
  147.         GET    SysBase
  148.         CALL    FindTask        ;get the owner of the device
  149.         movem.l    (sp)+,a0-a1
  150.         move.l    d0,PCM_OWNERTASK(a0)
  151.         bclr    #STATUSB_SHARED,PCM_FLAGS(a0)
  152.         btst    #SERB_SHARED,IO_SERFLAGS(a1)    ;use shared access?
  153.         beq.b    .sharedcont            ;no!
  154.         bset    #STATUSB_SHARED,PCM_FLAGS(a0)    ;yes!
  155.         bra.b    .sharedcont
  156.  
  157. .not1st        GET    SysBase
  158.         movem.l    a0/a1,-(sp)
  159.         sub.l    a1,a1
  160.         CALL    FindTask 
  161.         movem.l    (sp)+,a0/a1
  162.         cmp.l    PCM_OWNERTASK(a0),d0
  163.         beq.b    .no7wire        ;no need to check CTS/RTS again
  164.  
  165.         btst    #STATUSB_SHARED,PCM_FLAGS(a0)
  166.         beq.b    .sharederr
  167.         btst    #SERB_SHARED,IO_SERFLAGS(a1)    ;shared?
  168.         bne.b    .no7wire
  169.  
  170. .sharederr    move.b    #SerErr_DevBusy,IO_ERROR(a1)
  171.         bra.w    .end
  172.  
  173. .sharedcont    btst    #SERB_7WIRE,IO_SERFLAGS(a1)    ;CTS/RTS?
  174.         beq.b    .no7wire
  175.         bset    #STATUSB_USE7WIRE,PCM_FLAGS(a0)
  176.  
  177.         move.l    PCM_BASEADR(a0),a6
  178.         move.b    UART_MSR(a6),d0
  179.         btst    #4,d0
  180.         beq.b    .no7wire
  181.         bset    #STATUSB_CTS,PCM_FLAGS(a0)
  182.     
  183. .no7wire    move.l    devicebase(pc),a6
  184.         addq.w    #1,LIB_OPENCNT(a6)
  185.         addq.w    #1,PCM_UNITOPENCNT(a0)
  186.         bclr    #LIBB_DELEXP,MD_FLAGS(a6)
  187.  
  188.         move.l    #9600,IO_BAUD(a1)    ;fill in & set defult settings
  189.         move.b    #8,IO_READLEN(a1)
  190.         move.b    #8,IO_WRITELEN(a1)
  191.         move.b    #1,IO_STOPBITS(a1)
  192.         move.l    a0,-(sp)
  193.         bsr.w    setparams
  194.         move.l    (sp)+,a0
  195.  
  196.         move.l    PCM_BASEADR(a0),a1
  197.         move.b    #0,UART_FCR(a1)            ;FIFOs off
  198.         btst    #STATUSB_USEFIFO,PCM_FLAGS(a0)
  199.         beq.b    .nofifo
  200.         move.b    #7,UART_FCR(a1)            ;FIFOs on (yeah!!) 
  201.  
  202. .nofifo        move.b    UART_MSR(a1),d0            ;clear MSR
  203.         move.b    UART_RBR(a1),d0
  204.         move.b    UART_LSR(a1),d0
  205.         move.b    UART_IIR(a1),d0
  206.  
  207.         move.b    #%1011,UART_MCR(a1)        ;DTR/RTS/master int on
  208.         move.b    #%1111,UART_IER(a1)        ;enable all ints
  209.  
  210.         cmp.w    #1,PCM_UNITOPENCNT(a0)
  211.         bne.b    .notfirstopen
  212.  
  213.         ;If this is the first time this unit is opened we need
  214.         ;to wait a little while to allow the modem to init itself
  215.         ;otherwise DSR won't come on and some programs will complain.
  216.  
  217.         lea    dosname(pc),a1
  218.         moveq    #37,d0
  219.         GET    SysBase
  220.         CALL    OpenLibrary
  221.         movea.l    d0,a6
  222.         tst.l    d0
  223.         beq.b    .notfirstopen
  224.         move.l    #30,d1
  225.         CALL    Delay
  226.         move.l    a6,a1
  227.         GET    SysBase
  228.         CALL    CloseLibrary
  229.  
  230. .notfirstopen    move.l    devicebase(pc),a0
  231.         bra.b    .end
  232.  
  233. .error        move.b    #IOERR_OPENFAIL,IO_ERROR(a1)
  234. .end        move.l    (sp)+,a6
  235.         rts
  236.  
  237. dosname        dc.b    "dos.library",0
  238.  
  239. ;========================================================================
  240. ;---closedevice---   guaranteed to be single threaded
  241. ;a6=devicebase
  242. ;a1=io-request
  243. ;
  244. ;return d0
  245. ;0=do nothing
  246. ;seglist=unload device
  247. ;========================================================================
  248. closedevice    move.l    IO_UNIT(a1),a0
  249.         move.l    #-1,IO_UNIT(a1)
  250.         move.l    #-1,IO_DEVICE(a1)
  251.  
  252.         clr.l    d0
  253.         subq.w    #1,LIB_OPENCNT(a6)
  254.         subq.w    #1,PCM_UNITOPENCNT(a0)    ;last opener closed us?
  255.         bne.b    .end
  256.  
  257.         move.l    PCM_BASEADR(a0),a0    ;in that case turn
  258.         move.b    #0,UART_MCR(a0)        ;master int off
  259.         move.b    #0,UART_IER(a0)        ;ints off
  260.  
  261.         btst    #LIBB_DELEXP,MD_FLAGS(a6)    ;delayed expunge?
  262.         bne.b    .doexp
  263.         btst    #DEVINFOB_CONFIGURED,MD_MYFLAGS(a6) ;user removed card?
  264.         bne.b    .end
  265. .doexp        bsr.b    expunge                ;then expunge
  266. .end        rts
  267.  
  268. ;========================================================================
  269. ;---expunge---   guaranteed to be single threaded
  270. ;a6=devicebase
  271. ;
  272. ;return d0
  273. ;0=do nothing
  274. ;seglist=unload device
  275. ;========================================================================
  276. expunge        movem.l    d2/a5-a6,-(sp)
  277.         tst.w    LIB_OPENCNT(a6)
  278.         beq.b    .remove
  279.  
  280.         bset    #LIBB_DELEXP,MD_FLAGS(a6)    ;opencnt was not 0
  281.         clr.l    d0                ;do delayed expunge
  282.         bra.b    .end
  283.  
  284. .remove        move.l    a6,a5
  285.         bsr.w    cleanupdevice
  286.         move.l    MD_SEGLIST(a5),d2
  287.         move.l    a5,a1
  288.         REMOVE
  289.         move.l    a5,a1
  290.         moveq    #0,d0
  291.         move.w    LIB_NEGSIZE(a5),d0
  292.         suba.l    d0,a1
  293.         add.w    LIB_POSSIZE(a5),d0
  294.         GET    SysBase
  295.         CALL    FreeMem
  296.         move.l    d2,d0
  297.  
  298. ;        COLTESTR    ;!!!!!!!!!!!!!!!
  299.  
  300. .end        movem.l    (sp)+,d2/a5-a6
  301.         rts
  302. ;========================================================================
  303. ;---beginio---
  304. ;a6=devicebase
  305. ;a1=iorequest
  306. ;========================================================================
  307. beginio        movem.l    a6,-(sp)
  308.  
  309.         clr.b    IO_ERROR(a1)
  310.         move.b    #NT_MESSAGE,LN_TYPE(a1)
  311.  
  312. .noread        btst    #DEVINFOB_CONFIGURED,MD_MYFLAGS(a6)
  313.         beq.b    .nocard        ;card is not configured (removed)
  314.  
  315.         clr.l    d0
  316.         move.w    IO_COMMAND(a1),d0
  317.         cmp.l    #SER_DEVFINISH+1,d0    ;Is IO_COMMAND too high?
  318.         bge.b    .unknowncmd
  319.         add.w    d0,d0
  320.         lea    .cmdtable(pc),a0
  321.         add.w    d0,d0
  322.         move.l    (a0,d0.w),a0
  323.         cmp.l    #0,a0            ;Unsupported command?
  324.         beq.b    .unknowncmd
  325.         jsr    (a0)            ;Jump to CMD-code
  326.         bra.b    .cont
  327.  
  328. .unknowncmd    move.b    #IOERR_NOCMD,IO_ERROR(a1)
  329.         clr.b    IO_FLAGS(a1)
  330.         GET    SysBase
  331.         CALL    ReplyMsg
  332.         bra.b    .cont
  333.  
  334. .nocard        cmp.w    #CMD_READ,IO_COMMAND(a1)
  335.         beq.b    .nocardreadreq
  336.         move.b    #IOERR_SELFTEST,IO_ERROR(a1)
  337.         clr.b    IO_FLAGS(a1)
  338.         GET    SysBase
  339.         CALL    ReplyMsg
  340.  
  341. .cont        movem.l    (sp)+,a6
  342.         rts
  343.  
  344. ;Since the user have removed the card we have to queue read-requests
  345. ;to that the program calling us won't hang in a loop trying to post an
  346. ;io-request to us all the time resulting in that it will hang.
  347. .nocardreadreq    move.l    IO_UNIT(a1),a0
  348.         lea    PCM_READLIST(a0),a0
  349.         GET    SysBase
  350.         CALL    AddTail
  351.         bra.b    .cont
  352.  
  353.         cnop    0,4
  354. .cmdtable    dc.l    0        ;0    CMD_INVALID
  355.         dc.l    cmd_reset    ;1    CMD_RESET
  356.         dc.l    cmd_read    ;2    CMD_READ
  357.         dc.l    cmd_write    ;3    CMD_WRITE
  358.         dc.l    0        ;4    CMD_UPDATE
  359.         dc.l    cmd_clear    ;5    CMD_CLEAR
  360.         dc.l    0        ;6    *CMD_STOP
  361.         dc.l    0        ;7    *CMD_START
  362.         dc.l    cmd_flush    ;8    CMD_FLUSH
  363.         dc.l